
#include <QFileDialog>

#include "ventanaprincipal.h"
#include "ui_ventanaprincipal.h"
#include "dialogo.h"
#include "panelpreferencias.h"
#include "visorinstrumento.h"
#include "editorcompases.h"
#include "editorpatrones.h"

#define LATENCIA_VISUALIZACION 30

VentanaPrincipal::VentanaPrincipal(QWidget *parent) : QMainWindow(parent), ui(new Ui::VentanaPrincipal)
{
    ui->setupUi(this);

    QPixmap imagen(":/entrendor/Resources/caja.png");	
    setWindowIcon(QIcon(imagen));    

    idTemporizadorVisualizacion = 0;

    actualizarMenu();

}

VentanaPrincipal::~VentanaPrincipal()
{
    delete ui;

    Entrenador::destruir();
}

void VentanaPrincipal::on_actionPreferencias_triggered()
{
    Dialogo dialogo(this);

    PanelPreferencias* panel = new PanelPreferencias();

    dialogo.setContenido(panel);

    dialogo.exec();
}

void VentanaPrincipal::on_actionIniciar_triggered()
{	
    if (idTemporizadorVisualizacion > 0) {
        return;
    }

    Entrenador::getInstancia()->arrancar();
    idTemporizadorVisualizacion = startTimer(LATENCIA_VISUALIZACION);

}

void VentanaPrincipal::on_actionFinalizar_triggered()
{
    Entrenador::getInstancia()->parar();
    killTimer(idTemporizadorVisualizacion);
    idTemporizadorVisualizacion = 0;
}

void VentanaPrincipal::timerEvent(QTimerEvent* event)
{    
    if (!Entrenador::getInstancia()->estaActivo()) {
        killTimer(idTemporizadorVisualizacion);
        idTemporizadorVisualizacion = 0;
    }
    actualizarVistas();
}

void VentanaPrincipal::actualizarVistas()
{
    if (Entrenador::getInstancia()->haCambiadoPatron()) {
        ui->visorLineaTiempo->crearEscena();
    }

    ui->visorInstrumento->actualizar();
    ui->visorLineaTiempo->actualizar();
}

void VentanaPrincipal::actualizarMenu()
{
    bool hayProyectoAbierto = Entrenador::getInstancia()->getProyecto() != NULL;
    ui->actionGuardarProyecto->setEnabled(hayProyectoAbierto);
    ui->actionGuardarProyectoComo->setEnabled(hayProyectoAbierto);
    ui->actionCerrarProyecto->setEnabled(hayProyectoAbierto);
    ui->actionEditarCompases->setEnabled(hayProyectoAbierto);
    ui->actionEditarPatrones->setEnabled(hayProyectoAbierto);
}

void VentanaPrincipal::on_actionNuevoProyecto_triggered()
{
    Proyecto* proyecto = new Proyecto();
    Entrenador::getInstancia()->setProyecto(proyecto);

    actualizarVistas();
    actualizarMenu();
}

void VentanaPrincipal::on_actionAbrirProyecto_triggered()
{
    QString nombreFichero = QFileDialog::getOpenFileName(this, tr("Proyecto entrenador"), "../proyectos", tr("archivo XML (*.xml)"));

    if (nombreFichero.isEmpty()) {
        return;
    }

    Proyecto* proyecto = new Proyecto();
    proyecto->deserializar(nombreFichero);
    Entrenador::getInstancia()->setProyecto(proyecto);

    actualizarVistas();
    actualizarMenu();
    actualizarListaPatrones();
}

void VentanaPrincipal::on_actionGuardarProyecto_triggered()
{
    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
    if (proyecto == NULL) {
        return;
    }

    QString nombreArchivo = proyecto->getNombreArchivo();
    if (nombreArchivo.isEmpty()) {
        on_actionGuardarProyectoComo_triggered();
    }

    proyecto->serializar(nombreArchivo);
}

void VentanaPrincipal::on_actionGuardarProyectoComo_triggered()
{

    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
    if (proyecto == NULL) {
        return;
    }

    QString nombreFichero = QFileDialog::getSaveFileName(this,
        tr("Guardar proyecto"),
        "../proyectos/" + proyecto->getNombreArchivo(),
        tr("archivo XML (*.xml)"));

    if (nombreFichero.isEmpty()) {
        return;
    }

    proyecto->serializar(nombreFichero);
}

void VentanaPrincipal::on_actionCerrarProyecto_triggered()
{
    Entrenador::getInstancia()->setProyecto(NULL);

    actualizarVistas();
    actualizarMenu();
    actualizarListaPatrones();
}

void VentanaPrincipal::on_actionEditarCompases_triggered()
{
    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
    if (proyecto == NULL) {
        return;
    }

    EditorCompases editorCompases(this);

    editorCompases.setListaCompases(proyecto->getListaCompases());
    if (editorCompases.mostrarDialogo("Compases", true, DIALOGO_TIPO_ACEPTAR_CANCELAR)) {
        proyecto->setListaCompases(editorCompases.getListaCompases());
    }

    //TODO: reseleccionar el copmas ui->visorLineaTiempo->setCompas(Compas());

    actualizarListaPatrones();
    actualizarVistas();
}

void VentanaPrincipal::on_actionEditarPatrones_triggered()
{
    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
    if (proyecto == NULL) {
        return;
    }

    EditorPatrones editorPatrones(this);
    editorPatrones.setProyecto(proyecto);
    editorPatrones.setListaPatrones(proyecto->getListaPatrones());
    if (editorPatrones.mostrarDialogo("Patrones", true, DIALOGO_TIPO_ACEPTAR_CANCELAR)) {
        proyecto->setListaPatrones(editorPatrones.getListaPatrones());
    }

    //TODO: reseleccionar el patron ui->visorLineaTiempo->setCompas(Compas());

    actualizarListaPatrones();
    actualizarVistas();
}


void VentanaPrincipal::actualizarListaPatrones()
{
    ui->listwidgetPatrones->clear();

    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
    if (proyecto == NULL) {
        ui->listwidgetPatrones->clear();
        return;
    }

    int index = ui->comboPatrones->currentIndex();

    QStringList listaNombres;
    if (index == 0) {        
        foreach (Patron patron, proyecto->getListaPatrones()) {
            listaNombres.append(patron.getNombre());
        }
    } else if (index == 1) {
        foreach (Compas compas, proyecto->getListaCompases()) {
            listaNombres.append(compas.getNombre());
        }
    } else if (index == 2) {
        foreach (Ejercicio ejercicio, proyecto->getListaEjercicios()) {
            listaNombres.append(ejercicio.getNombre());
        }
    }

    ui->listwidgetPatrones->addItems(listaNombres);
}

void VentanaPrincipal::on_comboPatrones_activated(int index)
{   
    actualizarListaPatrones();
}


void VentanaPrincipal::on_listwidgetPatrones_currentRowChanged(int currentRow)
{
    int index = ui->comboPatrones->currentIndex();
    if (index == 0) { 
        Entrenador::getInstancia()->seleccionarPatron(currentRow);
    } else if (index == 1) {
        Entrenador::getInstancia()->seleccionarCompas(currentRow);
    } else if (index == 2) {
        Entrenador::getInstancia()->seleccionarEjercicio(currentRow);
    }
    actualizarVistas();
}

void VentanaPrincipal::on_actionSalir_triggered()
{
    close();
}
